home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
The Fatted Calf
/
The Fatted Calf.iso
/
Applications
/
Audio
/
Patchmix
/
Source
/
PaletteView.m
< prev
next >
Wrap
Text File
|
1992-08-18
|
6KB
|
211 lines
// PaletteView.m
// By Jayson Adams, NeXT Developer Support Team
// You may freely copy, distribute and reuse the code in this example.
// NeXT disclaims any warranty of any kind, expressed or implied, as to its
// fitness for any particular use.
// Modified by Mara Helmuth to accomodate multiple images.
// Unit Generator tiffs are 80w,80h, converters 80x66(overlap height-wise).
// PaletteView contains 18(+2repeated) ug tiffs and 6 converters:
// Up to release 1.1:
// Oscil Buzz Rand Evp Reson pchcps
// pchoct
// Comb Pluck Delay Reverb Ws cpspch
// + - * / Sound cpsoct
// octpch
// Preset Pfield Create octcps
// Release 1.2:
// Oscil Buzz Rand Evp Reson pchcps
// pchoct
// Comb Pluck Allpass Reverb cpspch delay will be in middle
// + - * / WS cpsoct
// octpch
// Sound Pfield Value C-expr ??? octcps
#import <math.h>
#import <appkit/NXImage.h>
#import <appkit/Window.h>
#import "TransparentWindow.h"
#import "PaletteView.h"
@implementation PaletteView
/* instance methods */
- (BOOL)acceptsFirstMouse
{
return YES;
}
- setImages
{
int num, row, col;
/* setup images */
image[0] = [NXImage findImageNamed:"Sound"];
image[1] = [NXImage findImageNamed:"Pfield"];
image[2] = [NXImage findImageNamed:"Preset"]; // Value
image[3] = [NXImage findImageNamed:"Cexpr"]; // C expression
image[4] = [NXImage findImageNamed:"User"];
image[5] = [NXImage findImageNamed:"Add"];
image[6] = [NXImage findImageNamed:"Sub"];
image[7] = [NXImage findImageNamed:"Mult"];
image[8] = [NXImage findImageNamed:"Div"];
image[9] = [NXImage findImageNamed:"WS"];
image[10] = [NXImage findImageNamed:"Comb"];
image[11] = [NXImage findImageNamed:"Pluck"];
image[12] = [NXImage findImageNamed:"NotWorking"]; // Should be Allpass, allpass is delay
image[13] = [NXImage findImageNamed:"Allpass"];
image[14] = [NXImage findImageNamed:"Reverb"];
image[15] = [NXImage findImageNamed:"Oscil"];
image[16] = [NXImage findImageNamed:"Buzz"];
image[17] = [NXImage findImageNamed:"Rand"];
image[18] = [NXImage findImageNamed:"Evp"];
image[19] = [NXImage findImageNamed:"Reson"];
image[20] = [NXImage findImageNamed:"octcps"];
image[21] = [NXImage findImageNamed:"octpch"];
image[22] = [NXImage findImageNamed:"cpspch"];
image[23] = [NXImage findImageNamed:"cpsoct"];
image[24] = [NXImage findImageNamed:"pchoct"];
image[25] = [NXImage findImageNamed:"pchcps"];
num = 0;
for(row = 0; num < PAL_IMAGES; row++) {
for(col = 0; col < COLS; col++) {
/* the hotRect marks the image's bounds */
[image[num] getSize:&(hotRect[num].size)];
hotRect[num].origin.x = col*ICON_SIZE;
hotRect[num].origin.y = row*ICON_SIZE;
num++;
if(num == PAL_IMAGES)
break;
}
}
// do converter images
for(row = 0; row < CONV_IMAGES; row++) {
[image[num] getSize:&(hotRect[num].size)];
hotRect[num].origin.x = COLS * ICON_SIZE; // right hand column
hotRect[num].origin.y = row*CONV_HEIGHT;
num++;
}
[self display];
return self;
}
- mouseDown:(NXEvent *)theEvent
{
id imageWindow;
NXRect windowRect;
NXPoint hitPoint, offset, mouseLocation;
int chosen, midx, midy, row, col;
/* return if not within the image's bounds */
hitPoint = theEvent->location;
[self convertPoint:&hitPoint fromView:nil];
midx = ICON_SIZE*(COLS+1)/2;
midy = ICON_SIZE*ROWS/2;
chosen = -1;
if(hitPoint.x < midx) { // find the column
if(hitPoint.x < ICON_SIZE)
col = 0;
else if(hitPoint.x < 2*ICON_SIZE)
col = 1;
else
col = 2;
}
else {
if(hitPoint.x < midx+ICON_SIZE)
col = 3;
else if(hitPoint.x < ICON_SIZE*5)
col = 4;
else
col = 5;
}
if(col == 5) { // converter, find row
if(hitPoint.y < midy) {
if(hitPoint.y < CONV_HEIGHT)
chosen = 20;
else if(hitPoint.y < CONV_HEIGHT*2)
chosen = 21;
else
chosen = 22;
}
else
if(hitPoint.y < midy+CONV_HEIGHT)
chosen = 23;
else if(hitPoint.y < CONV_HEIGHT*5)
chosen = 24;
else
chosen = 25;
}
else { // not a converter ugen, find row
if(hitPoint.y < midy) {
if(hitPoint.y < ICON_SIZE)
row = 0;
else
row = 1;
}
else {
if(hitPoint.y < midy+ICON_SIZE)
row = 2;
else
row = 3;
}
chosen = row*5+col;
}
// convert the hotRect to screen-based coordinates
windowRect = hotRect[chosen];
dragImage = image[chosen];
[patchVw setUgen:chosen]; // tell PatchView which image
[self convertRect:&windowRect toView:nil];
[window convertBaseToScreen:&windowRect.origin];
imageWindow = [[TransparentWindow alloc] initForImage:dragImage
at:&(windowRect.origin)
forView:self];
/* compute the offset from the image's origin to the mouse location */
offset.x = hitPoint.x - NX_X(&hotRect[chosen]);
offset.y = hitPoint.y - NX_Y(&hotRect[chosen]);
/* convert the mousedown location to screen coordinates */
mouseLocation = theEvent->location;
[window convertBaseToScreen:&mouseLocation];
/* go into the dragging loop */
[imageWindow dragFromMouseDown:&mouseLocation mouseOffset:&offset];
return self;
}
- drawSelf:(NXRect *)rects :(int)count
{
int i;
NXDrawGrayBezel(&bounds, NULL); /* not sure I like this */
for(i = 0; i < PAL_IMAGES+CONV_IMAGES; i++) {
[image[i] composite:NX_SOVER toPoint:&hotRect[i].origin];
}
return self;
}
@end